home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / prog_c / cuj0696.zip / DWYER.ZIP / SPECTRAL.TST / GETCTLDA.CX < prev    next >
Text File  |  1996-03-09  |  6KB  |  228 lines

  1. /* ============ */
  2. /* getctlda.cx    */
  3. /* ============ */
  4. #include <io.h>
  5. #include <signal.h>
  6. #include <stdio.h>
  7. #include <xtendefs.h>
  8.  
  9. #define FLUSH_LINE(u)            \
  10.     {                    \
  11.     int    x;            \
  12.     do                \
  13.     {                \
  14.         x = getc(u);        \
  15.     }                \
  16.     while (x != EOF && x != '\n');    \
  17.     }
  18. /* ==================================================================== */
  19. /* AbortGracefully - does the right thing at <CTRL> C or <CTRL> break    */
  20. /* ==================================================================== */
  21. static void
  22. AbortGracefully(int unused)
  23. {
  24.     if (unused || !unused)        /* Silences Most Compilers */
  25.     exit(1);
  26. }
  27. /* ==================================================== */
  28. /* GetStr - Prompts operator with s to get string Str    */
  29. /* ==================================================== */
  30. void
  31. GetStr(char *s, char *Str)
  32. {
  33.     fprintf(stderr, "%s", s);
  34.  
  35.     scanf("%s", Str);
  36.  
  37.     FLUSH_LINE(stdin);
  38. }
  39. /* ============================================================ */
  40. /* GetShort - Prompts operator with s to get short integer i    */
  41. /* ============================================================ */
  42. void
  43. GetShort(char *s, short *i)
  44. {
  45.     fprintf(stderr, "%s", s);
  46.  
  47.     scanf("%d", i);
  48.  
  49.     FLUSH_LINE(stdin);
  50. }
  51. /* ==================================================================== */
  52. /* GetControlData - Prompts user for Multiplier(s), Modulus & Dimension */
  53. /* ==================================================================== */
  54. short
  55. GetControlData(USHORT *Multiplier, USHORT *Modulus, short *Dimension,
  56.            short *HowMany)
  57. {
  58.     short   InputOK = TRUE;
  59.     short   RelPrime;
  60.     int     NewlineCh;
  61.     USHORT  Tmp1[NE];
  62.     char    TmpStr[128];
  63.  
  64.     /* -------------------- */
  65.     /* Execute exit() on ^C */
  66.     /* -------------------- */
  67.     signal(SIGINT, AbortGracefully);
  68.  
  69.     NewlineCh = _isatty(_fileno(stdin)) ? '\r' : '\n';
  70.  
  71.     for (;;)
  72.     {
  73.     GetShort("How Many Multipliers? [1 or 2]: ", HowMany);
  74.     if (*HowMany == 1 || *HowMany == 2)
  75.     {
  76.         break;
  77.     }
  78.     fprintf(stderr, "Incorrect Response: %d\n", *HowMany);
  79.     }
  80.     fflush(NULL);fprintf(stderr, "%c", NewlineCh);
  81.  
  82.     if (*HowMany == 1)
  83.     {
  84.     for (;;)
  85.     {
  86.         GetStr("Enter Multiplier:        ", TmpStr);
  87.         ASCTOX(TmpStr, Multiplier);
  88.  
  89.         XFLOOR(Multiplier, Tmp1);
  90.         if (XEQUAL(Multiplier, Tmp1))
  91.         {
  92.         break;
  93.         }
  94.         fprintf(stderr, "Multiplier is not integral: ");
  95.         /* -------------------------------- */
  96.         /* Print 5 Frac digits in Min Field */
  97.         /* -------------------------------- */
  98.         fPutXFrac(stderr, Multiplier, 5, 0);
  99.         fprintf(stderr, "\n");
  100.     }
  101.     }
  102.     else
  103.     {
  104.     for (;;)
  105.     {
  106.         GetStr("Enter First  Multiplier: ", TmpStr);
  107.         ASCTOX(TmpStr, Multiplier);
  108.  
  109.         XFLOOR(Multiplier, Tmp1);
  110.         if (XEQUAL(Multiplier, Tmp1))
  111.         {
  112.         break;
  113.         }
  114.         fprintf(stderr, "Multiplier is not integral: ");
  115.         /* -------------------------------- */
  116.         /* Print 5 Frac digits in Min Field */
  117.         /* -------------------------------- */
  118.         fPutXFrac(stderr, Multiplier, 5, 0);
  119.         fprintf(stderr, "\n");
  120.     }
  121.     fflush(NULL);fprintf(stderr, "%c", NewlineCh);
  122.  
  123.     for (;;)
  124.     {
  125.         GetStr("Enter Second Multiplier: ", TmpStr);
  126.         ASCTOX(TmpStr, Multiplier + NE);
  127.  
  128.         XFLOOR(Multiplier + NE, Tmp1);
  129.         if (XEQUAL(Multiplier + NE, Tmp1))
  130.         {
  131.         break;
  132.         }
  133.         fprintf(stderr, "Multiplier is not integral: ");
  134.         /* -------------------------------- */
  135.         /* Print 5 Frac digits in Min Field */
  136.         /* -------------------------------- */
  137.         fPutXFrac(stderr, Multiplier + NE, 5, 0);
  138.         fprintf(stderr, "\n");
  139.     }
  140.     }
  141.  
  142.     fflush(NULL);fprintf(stderr, "%c", NewlineCh);
  143.     for (;;)
  144.     {
  145.     GetStr("Enter Modulus:           ", TmpStr);
  146.     ASCTOX(TmpStr, Modulus);
  147.  
  148.     if (XGTE(EZERO, Modulus))
  149.     {
  150.         fprintf(stderr, "Modulus (%s) Must be > 0\n", TmpStr);
  151.         continue;
  152.     }
  153.     XFLOOR(Modulus, Tmp1);
  154.     if (XEQUAL(Modulus, Tmp1))
  155.     {
  156.         break;
  157.     }
  158.     fprintf(stderr, "Modulus is not integral: ");
  159.     /* -------------------------------- */
  160.     /* Print 5 Frac digits in Min Field */
  161.     /* -------------------------------- */
  162.     fPutXFrac(stderr, Modulus, 5, 0);
  163.     fprintf(stderr, "\n");
  164.     }
  165.  
  166.     if (*HowMany == 1)
  167.     {
  168.     GetGCD(Modulus, Multiplier, Tmp1);
  169.     RelPrime = (short) (XEQUAL(Tmp1, EONE) &&
  170.         !XEQUAL(Multiplier, EONE) &&
  171.         !XEQUAL(Modulus, EONE));
  172.     if (!RelPrime)
  173.     {
  174.         fprintf(stderr,
  175.         "\nMultiplier and modulus not relatively prime.\n");
  176.         fprintf(stderr, "GCD of Multiplier and Modulus = ");
  177.         fPutXInt(stderr, Tmp1, 0);    /* Print GCD in Min field */
  178.         fprintf(stderr, "\n"); fflush(stderr);
  179.     }
  180.  
  181.     InputOK = (short)(InputOK && RelPrime);
  182.     }
  183.     else
  184.     {
  185.     GetGCD(Modulus, Multiplier, Tmp1);
  186.     RelPrime = (short) (XEQUAL(Tmp1, EONE) &&
  187.         !XEQUAL(Multiplier, EONE) &&
  188.         !XEQUAL(Modulus, EONE));
  189.     if (!RelPrime)
  190.     {
  191.         fprintf(stderr,
  192.         "\nFirst Multiplier and modulus not relatively prime.\n");
  193.         fprintf(stderr, "GCD of First Multiplier and Modulus = ");
  194.         fPutXInt(stderr, Tmp1, 0);    /* Print GCD in Min field */
  195.         fprintf(stderr, "\n"); fflush(stderr);
  196.     }
  197.  
  198.     InputOK = (short)(InputOK && RelPrime);
  199.  
  200.     GetGCD(Modulus, Multiplier+NE, Tmp1);
  201.     RelPrime = (short) (XEQUAL(Tmp1, EONE) &&
  202.         !XEQUAL(Multiplier+NE, EONE) &&
  203.         !XEQUAL(Modulus, EONE));
  204.     if (!RelPrime)
  205.     {
  206.         fprintf(stderr,
  207.         "Second Multiplier and modulus not relatively prime.\n");
  208.         fprintf(stderr, "GCD of Second Multiplier and Modulus = ");
  209.         fPutXInt(stderr, Tmp1, 0);    /* Print GCD in Min field */
  210.         fprintf(stderr, "\n"); fflush(stderr);
  211.     }
  212.  
  213.     InputOK = (short)(InputOK && RelPrime);
  214.     }
  215.     fflush(NULL);fprintf(stderr, "%c", NewlineCh);
  216.     if (InputOK)
  217.     {
  218.     GetShort("Enter Maximum Dimension: ", Dimension);
  219.     fflush(stderr);
  220.     }
  221.     else
  222.     {
  223.     fprintf(stderr, "Error(s) detected in input data\n");
  224.     }
  225.  
  226.     return(InputOK);
  227. }
  228.